import { createRouter, createWebHistory } from "vue-router";
import { routes } from "./router";
import NProgress from "nprogress";
import "nprogress/nprogress.css";
import { decode, encode } from "js-base64";
import { filterAsyncRouter } from "@/utils/tool";
import { layoutMap } from "./router";
import { useUserStore } from "/@/stores";

NProgress.configure({ showSpinner: false });

const router = createRouter({
  history: createWebHistory(),
  routes: [...routes],
  scrollBehavior(to, from, savedPosition) {
    if (savedPosition) {
      return savedPosition;
    } else {
      return { top: 0 };
    }
  },
});

// 前置守卫
router.beforeEach((to, from, next) => {
  NProgress.start();

  document.title =
    to.meta && to.meta.title ? to.meta.title + " - 管理应用" : "管理系统";
  // sessionStorage 关闭该应用就清除token 再次打开需要登录
  const jwt = sessionStorage.getItem("jwt") || "";

  if (to.path === "/login") {
    // 如果未登录就重定向如果已登录则跳转出去
    !!jwt ? next("/") : next();
  } else {
    // 当前 如果 在 登录页面， 且没有登录，不让跳 别的路由
    if (from.name === "Login" && !jwt) {
      next(false);
      return false;
    }
    // 如果 登录了
    if (!!jwt) {
      // 判断 该路由是否 设定访问权限，
      if (to.meta.hasOwnProperty("roles")) {
        // hasOwnProperty： 用来检查一个对象是否具有指定名称的自身属性的
        let rolesMete = to.meta.roles || [];
        let { roles } = JSON.parse(decode(jwt));
        //  判断 该用户 的 角色 是否 有权限 访问 该路由
        rolesMete.includes(roles) ? next() : next("/error");
        return false;
      }
      next();
    } else {
      next("/login");
    }
  }
});

router.afterEach(() => {
  NProgress.done();
});

export default router;

// 用户登录
export const UserLogin = (loginInfo) => {
  sessionStorage.setItem("jwt", encode(JSON.stringify(loginInfo)));

  setTimeout(() => {
    router.replace("/");
  }, 1000);
};

// 根据登录 角色名称 展示相应路由
export const RoutersShowByRole = () => {
  const jwt = sessionStorage.getItem("jwt") || "";

  const { name, pwd } = JSON.parse(localStorage.getItem("userInfo"));

  let { roles } = JSON.parse(decode(jwt));

  let deepCopy = JSON.parse(JSON.stringify(layoutMap));
  let accessedRouters = filterAsyncRouter(deepCopy, name);
  return accessedRouters;
};

// 退出登录
export const UserLoginOut = () => {
  // 注意顺序， 先清缓存， 在路由跳转
  sessionStorage.clear();
  localStorage.clear();

  router.replace("/login");
};
